<?php

namespace App\Constants;

use App\Constants\AbstractEnum;

/**
 * 文件分类枚举
 * 定义文件的业务分类和用途
 */
class FileCategoryEnum extends AbstractEnum
{
    // 用户相关
    public const AVATAR = 'avatar';           // 用户头像
    public const PROFILE = 'profile';         // 用户资料文件
    public const CERTIFICATE = 'certificate'; // 证书文件

    // 员工相关
    public const EMPLOYEE_DOC = 'employee_doc'; // 员工文档
    public const CONTRACT = 'contract';         // 劳动合同
    public const RESUME = 'resume';           // 简历
    public const TRAINING = 'training';       // 培训资料

    // 组织架构
    public const ORG_CHART = 'org_chart';     // 组织架构图
    public const DEPARTMENT_DOC = 'department_doc'; // 部门文档

    // 薪资管理
    public const SALARY_DOC = 'salary_doc';   // 薪资文档
    public const PAYROLL = 'payroll';         // 工资单
    public const TAX_DOC = 'tax_doc';         // 税务文件

    // 考勤管理
    public const ATTENDANCE_REC = 'attendance_rec'; // 考勤记录
    public const LEAVE_DOC = 'leave_doc';     // 请假文件
    public const OVERTIME_DOC = 'overtime_doc'; // 加班文件

    // 系统文件
    public const SYSTEM_BACKUP = 'system_backup'; // 系统备份
    public const LOG_FILE = 'log_file';       // 日志文件
    public const CONFIG_FILE = 'config_file'; // 配置文件

    // 模板文件
    public const TEMPLATE = 'template';       // 模板文件
    public const FORM = 'form';              // 表单文件

    // 其他
    public const GENERAL = 'general';         // 通用文件
    public const TEMP = 'temp';              // 临时文件

    /**
     * 获取文件分类标签
     */
    public static function getLabels(): array
    {
        return [
            self::AVATAR => '用户头像',
            self::PROFILE => '用户资料',
            self::CERTIFICATE => '证书文件',
            self::EMPLOYEE_DOC => '员工文档',
            self::CONTRACT => '劳动合同',
            self::RESUME => '简历',
            self::TRAINING => '培训资料',
            self::ORG_CHART => '组织架构图',
            self::DEPARTMENT_DOC => '部门文档',
            self::SALARY_DOC => '薪资文档',
            self::PAYROLL => '工资单',
            self::TAX_DOC => '税务文件',
            self::ATTENDANCE_REC => '考勤记录',
            self::LEAVE_DOC => '请假文件',
            self::OVERTIME_DOC => '加班文件',
            self::SYSTEM_BACKUP => '系统备份',
            self::LOG_FILE => '日志文件',
            self::CONFIG_FILE => '配置文件',
            self::TEMPLATE => '模板文件',
            self::FORM => '表单文件',
            self::GENERAL => '通用文件',
            self::TEMP => '临时文件',
        ];
    }

    /**
     * 获取文件分类描述
     */
    public static function getDescriptions(): array
    {
        return [
            self::AVATAR => '用户头像图片文件',
            self::PROFILE => '用户个人资料相关文件',
            self::CERTIFICATE => '各类证书和资质文件',
            self::EMPLOYEE_DOC => '员工相关文档资料',
            self::CONTRACT => '劳动合同及相关协议',
            self::RESUME => '员工简历及求职资料',
            self::TRAINING => '培训资料和课程文件',
            self::ORG_CHART => '组织架构图和部门结构图',
            self::DEPARTMENT_DOC => '部门相关文档资料',
            self::SALARY_DOC => '薪资管理相关文档',
            self::PAYROLL => '员工工资单和薪资报表',
            self::TAX_DOC => '税务申报和相关文件',
            self::ATTENDANCE_REC => '考勤记录和统计报表',
            self::LEAVE_DOC => '请假申请和批准文件',
            self::OVERTIME_DOC => '加班申请和记录文件',
            self::SYSTEM_BACKUP => '系统数据备份文件',
            self::LOG_FILE => '系统运行日志文件',
            self::CONFIG_FILE => '系统配置文件',
            self::TEMPLATE => '各类业务模板文件',
            self::FORM => '表单模板和申请表',
            self::GENERAL => '通用业务文件',
            self::TEMP => '临时文件和缓存文件',
        ];
    }

    /**
     * 获取文件分类图标
     */
    public static function getIcons(): array
    {
        return [
            self::AVATAR => 'user-circle',
            self::PROFILE => 'id-card',
            self::CERTIFICATE => 'certificate',
            self::EMPLOYEE_DOC => 'user-tie',
            self::CONTRACT => 'file-contract',
            self::RESUME => 'file-user',
            self::TRAINING => 'graduation-cap',
            self::ORG_CHART => 'sitemap',
            self::DEPARTMENT_DOC => 'building',
            self::SALARY_DOC => 'money-bill-wave',
            self::PAYROLL => 'receipt',
            self::TAX_DOC => 'calculator',
            self::ATTENDANCE_REC => 'calendar-check',
            self::LEAVE_DOC => 'calendar-minus',
            self::OVERTIME_DOC => 'clock',
            self::SYSTEM_BACKUP => 'database',
            self::LOG_FILE => 'file-alt',
            self::CONFIG_FILE => 'cogs',
            self::TEMPLATE => 'file-code',
            self::FORM => 'clipboard-list',
            self::GENERAL => 'file',
            self::TEMP => 'file-exclamation',
        ];
    }

    /**
     * 获取文件分类的保留期限（天数）
     */
    public static function getRetentionPeriod(string $category): int
    {
        $periods = [
            self::AVATAR => 365 * 5,          // 5年
            self::PROFILE => 365 * 10,        // 10年
            self::CERTIFICATE => 365 * 10,    // 10年
            self::EMPLOYEE_DOC => 365 * 5,    // 5年
            self::CONTRACT => 365 * 10,       // 10年
            self::RESUME => 365 * 3,          // 3年
            self::TRAINING => 365 * 5,        // 5年
            self::ORG_CHART => 365 * 2,       // 2年
            self::DEPARTMENT_DOC => 365 * 3,  // 3年
            self::SALARY_DOC => 365 * 7,      // 7年（税务要求）
            self::PAYROLL => 365 * 7,         // 7年
            self::TAX_DOC => 365 * 7,         // 7年
            self::ATTENDANCE_REC => 365 * 3,  // 3年
            self::LEAVE_DOC => 365 * 3,       // 3年
            self::OVERTIME_DOC => 365 * 3,    // 3年
            self::SYSTEM_BACKUP => 365 * 2,   // 2年
            self::LOG_FILE => 365,            // 1年
            self::CONFIG_FILE => 365 * 2,     // 2年
            self::TEMPLATE => 365 * 5,        // 5年
            self::FORM => 365 * 3,            // 3年
            self::GENERAL => 365 * 2,         // 2年
            self::TEMP => 30,                 // 30天
        ];

        return $periods[$category] ?? 365; // 默认1年
    }

    /**
     * 获取文件分类的访问权限级别
     */
    public static function getAccessLevel(string $category): string
    {
        $levels = [
            self::AVATAR => 'public',         // 公开
            self::PROFILE => 'private',       // 私有
            self::CERTIFICATE => 'restricted', // 受限
            self::EMPLOYEE_DOC => 'private',  // 私有
            self::CONTRACT => 'restricted',   // 受限
            self::RESUME => 'private',        // 私有
            self::TRAINING => 'internal',     // 内部
            self::ORG_CHART => 'internal',    // 内部
            self::DEPARTMENT_DOC => 'department', // 部门内
            self::SALARY_DOC => 'restricted', // 受限
            self::PAYROLL => 'private',       // 私有
            self::TAX_DOC => 'restricted',    // 受限
            self::ATTENDANCE_REC => 'department', // 部门内
            self::LEAVE_DOC => 'department',  // 部门内
            self::OVERTIME_DOC => 'department', // 部门内
            self::SYSTEM_BACKUP => 'admin',   // 管理员
            self::LOG_FILE => 'admin',        // 管理员
            self::CONFIG_FILE => 'admin',     // 管理员
            self::TEMPLATE => 'internal',     // 内部
            self::FORM => 'internal',         // 内部
            self::GENERAL => 'internal',      // 内部
            self::TEMP => 'private',          // 私有
        ];

        return $levels[$category] ?? 'internal'; // 默认内部访问
    }

    /**
     * 检查文件分类是否需要审核
     */
    public static function requiresApproval(string $category): bool
    {
        $approvalRequired = [
            self::CONTRACT,
            self::CERTIFICATE,
            self::SALARY_DOC,
            self::TAX_DOC,
            self::SYSTEM_BACKUP,
            self::CONFIG_FILE,
        ];

        return in_array($category, $approvalRequired);
    }

    /**
     * 获取文件分类支持的文件类型
     */
    public static function getSupportedTypes(string $category): array
    {
        $typeRestrictions = [
            self::AVATAR => ['image'], // 只支持图片
            self::CONTRACT => ['document', 'pdf'], // 文档和PDF
            self::RESUME => ['document', 'pdf'], // 文档和PDF
            self::TRAINING => ['document', 'pdf', 'video', 'presentation'], // 多媒体
            self::PAYROLL => ['spreadsheet', 'pdf'], // 表格和PDF
            self::SALARY_DOC => ['document', 'spreadsheet', 'pdf'], // 文档、表格、PDF
            self::ATTENDANCE_REC => ['spreadsheet', 'pdf'], // 表格和PDF
            self::SYSTEM_BACKUP => ['archive'], // 压缩包
            self::LOG_FILE => ['document', 'archive'], // 文本和压缩包
        ];

        return $typeRestrictions[$category] ?? ['*']; // 默认支持所有类型
    }

    /**
     * 检查文件分类是否为敏感信息
     */
    public static function isSensitive(string $category): bool
    {
        $sensitiveCategories = [
            self::CERTIFICATE,
            self::CONTRACT,
            self::SALARY_DOC,
            self::PAYROLL,
            self::TAX_DOC,
            self::PROFILE,
        ];

        return in_array($category, $sensitiveCategories);
    }

    /**
     * 获取文件分类的业务模块
     */
    public static function getBusinessModule(string $category): string
    {
        $modules = [
            self::AVATAR => 'user',
            self::PROFILE => 'user',
            self::CERTIFICATE => 'user',
            self::EMPLOYEE_DOC => 'employee',
            self::CONTRACT => 'employee',
            self::RESUME => 'employee',
            self::TRAINING => 'employee',
            self::ORG_CHART => 'organization',
            self::DEPARTMENT_DOC => 'organization',
            self::SALARY_DOC => 'salary',
            self::PAYROLL => 'salary',
            self::TAX_DOC => 'salary',
            self::ATTENDANCE_REC => 'attendance',
            self::LEAVE_DOC => 'attendance',
            self::OVERTIME_DOC => 'attendance',
            self::SYSTEM_BACKUP => 'system',
            self::LOG_FILE => 'system',
            self::CONFIG_FILE => 'system',
            self::TEMPLATE => 'system',
            self::FORM => 'system',
            self::GENERAL => 'general',
            self::TEMP => 'temp',
        ];

        return $modules[$category] ?? 'general';
    }

    /**
     * 获取文件分类的存储建议
     */
    public static function getStorageRecommendation(string $category): string
    {
        $recommendations = [
            self::AVATAR => 'local',          // 头像使用本地存储
            self::PROFILE => 'local',         // 资料使用本地存储
            self::CERTIFICATE => 'local',     // 证书使用本地存储
            self::EMPLOYEE_DOC => 'local',    // 员工文档使用本地存储
            self::CONTRACT => 'local',        // 合同使用本地存储
            self::RESUME => 'local',          // 简历使用本地存储
            self::TRAINING => 'local',        // 培训资料使用本地存储
            self::ORG_CHART => 'local',       // 组织架构图使用本地存储
            self::DEPARTMENT_DOC => 'local',  // 部门文档使用本地存储
            self::SALARY_DOC => 'local',      // 薪资文档使用本地存储
            self::PAYROLL => 'local',         // 工资单使用本地存储
            self::TAX_DOC => 'local',         // 税务文件使用本地存储
            self::ATTENDANCE_REC => 'local',  // 考勤记录使用本地存储
            self::LEAVE_DOC => 'local',       // 请假文件使用本地存储
            self::OVERTIME_DOC => 'local',    // 加班文件使用本地存储
            self::SYSTEM_BACKUP => 'local',   // 系统备份使用本地存储
            self::LOG_FILE => 'local',        // 日志文件使用本地存储
            self::CONFIG_FILE => 'local',     // 配置文件使用本地存储
            self::TEMPLATE => 'local',        // 模板文件使用本地存储
            self::FORM => 'local',            // 表单文件使用本地存储
            self::GENERAL => 'local',         // 通用文件使用本地存储
            self::TEMP => 'local',            // 临时文件使用本地存储
        ];

        return $recommendations[$category] ?? 'local'; // 默认本地存储
    }
}
